<?php
    /** SystemOneAPI class version 0.4 BETA
        by Rodolfo N. Duldulao, Jr.
       Assistant Professor 1
       Institute of Computer Science, UPLB
       
       
    **/


    class SystemOneAPI {
       private $APIUsername;
       private $APIPassword;
       
       private $APIUrl;
       
       private $APIContents; //array
       private $curlHandle;
       private $sessionInfo;
       private $lastError;
       private $rawData;
       function __construct($service_list, $username, $password) {
           $this->APIUsername=$username;
           $this->APIPassword=$password;
          
          //setup common cUrl properties
          $this->curlHandle = curl_init();
          curl_setopt($this->curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );
          curl_setopt($this->curlHandle, CURLOPT_USERPWD, "$username:$password");
          curl_setopt($this->curlHandle, CURLOPT_FOLLOWLOCATION, TRUE);
          curl_setopt($this->curlHandle, CURLOPT_SSLVERSION,3);
          curl_setopt($this->curlHandle, CURLOPT_SSL_VERIFYPEER, FALSE);
          curl_setopt($this->curlHandle, CURLOPT_SSL_VERIFYHOST, FALSE);
          curl_setopt($this->curlHandle, CURLOPT_HEADER, false);
          curl_setopt($this->curlHandle, CURLOPT_POST, true);    
          curl_setopt($this->curlHandle, CURLOPT_RETURNTRANSFER, true);
          
          if (gettype($service_list)=="string") {  
	          $this->APIUrl = $service_list;          
	          $ret =  $this->_initAPIContents();
	          if (!$ret) {
				echo $this->lastError;
	             unset($this);
	          }
          } else if (gettype($service_list)=="object") {
             $this->APIContents = $service_list;
          }
       }
       
       function _initAPIContents() {
          curl_setopt($this->curlHandle, CURLOPT_URL, $this->APIUrl);
          
          $val = curl_exec($this->curlHandle);
          if (curl_error($this->curlHandle)) {
             if (curl_error($this->curlHandle)) $this->lastError = curl_error($this->curlHandle);
             return FALSE;             
          }
          $responseCode = curl_getinfo($this->curlHandle,CURLINFO_HTTP_CODE);
          echo $responseCode;
          if ($responseCode == 401) {
             $this->lastError = "Client Request Error ($responseCode) Unauthorized connection.  Your API username and password is incorrect.";
             return FALSE;
          } else
          if ($responseCode >= 400 && $responseCode < 500) {
             $this->lastError = "Client Request Error ($responseCode).";
             return FALSE;
          } else
          if ($responseCode >=500) {
             $this->lastError = "Server error ($responseCode)."  ;
             return FALSE;
          }
           $this->APIContents = json_decode($val);
       
          if (function_exists('json_last_error')) {
           if (json_last_error() ) {
             
             $this->lastError = json_last_error();
             return FALSE;
           } 
          }
          return TRUE;
       
       }
       
       function execute($name, $params=array(), $optional_params = array()) {
          $this->lastError = NULL;
          if (!isset($this->APIContents->{$name})) {
             $this->lastError = "Service/Operation named '$name' is not initialized.";
             return FALSE;
          }
          $operation = $this->APIContents->{$name};;
          
       
          $POST_DATA = array();
          
          $sess_info = $this->getSessionInfo();
          if (!$sess_info && $operation->session_info_required) {
             $this->lastError='There is no session information associated with this object.';
             return FALSE;
          }
          if ($sess_info != NULL) {
          foreach ($sess_info as $key=>$value) {
             $POST_DATA[$key] = $value;
          }
          }
          
          if (isset($operation->parameters)) {
          foreach ($operation->parameters as $param)  {
             if (isset($params[$param])) {
                $POST_DATA[$param] = $params[$param];
             } else {
                $this->lastError='Request has missing parameter ' . $param . '.';
                return FALSE;
             }
          }
          }
          
          if (isset($operation->optionalParameters)) {
          foreach ($operation->optionalParameters as $param) {
             if (isset($optional_params[$param])) $POST_DATA[$param]=$optional_params;
          }
          }
          $postString = http_build_query($POST_DATA,'','&');
          
          curl_setopt($this->curlHandle, CURLOPT_URL, $operation->url);
          curl_setopt($this->curlHandle, CURLOPT_POSTFIELDS, $postString);
          $val = curl_exec($this->curlHandle);
          $this->rawData=$val;
          $responseCode = curl_getinfo($this->curlHandle,CURLINFO_HTTP_CODE);
          
          if ($responseCode == 401) {
             $this->lastError = "Client Request Error ($responseCode) Unauthorized connection.  Your API username and password is incorrect.";
             return FALSE;
          } else
          if ($responseCode >= 400 && $responseCode < 500) {
             $this->lastError = "Client Request Error ($responseCode).";
             return FALSE;
          } else
          if ($responseCode >=500) {
             $this->lastError = "Server error ($responseCode)."  ;
             return FALSE;
          }
          //echo curl_error($this->curlHandle) . "<br/>";
          $result = json_decode($val);
          if (function_exists('json_last_error')) {
          if (json_last_error()) {
             $this->lastError = "Error in decoding response: $val";
             return FALSE;
          }
          }
          if ($result) {
              if (isset($result->{'session_info'})) {
                 $this->sessionInfo = $result->{'session_info'};
                $this->lastError = NULL;
                return TRUE;
                
             }
              if (isset($result->{'result'})) {
                $this->lastError = NULL;
                 return $result->{'result'};
             
             }
             
             if (isset($result->{'error'})) {
                 $this->lastError = NULL;
                $this->_processError($result->{'error'});
                return FALSE;
             }
          }
          
          return FALSE;
          
       }
       function getRawData() {
          return $this->rawData;
       }
       function _processError($error) {
          $this->lastError = $error->{'message'};
       }
       function getLastError() {
          return $this->lastError;
       }
       
       function setSessionInfo($sess_info) {
          $this->sessionInfo = $sess_info;
       }
       
       function getSessionInfo() {
           if ($this->sessionInfo) return $this->sessionInfo;
          
       }
       function close() {
          curl_close($this->curlHandle);
       
       }
       function getAPIContents() {
          //$copy = array();
          //foreach ($this->APIContents as $index=>$content) $copy[$index] = $content;
          return $this->APIContents;
       }
       
        function showAPIContents() {
          print "<h2>SystemOne API Contents</h2>";
          if ($this->APIContents) {
          foreach ($this->APIContents as $name=>$details) {
             $content =  "<div>";
            $content .= "<p><u><b>$name</b></u></p>";
            $content .= "<p><b>Description: </b> " . $details->{'description'} . "<br/>" ;
            $content .= "<b>Session Info Required :</b> " . (($details->{'session_info_required'}) ? "YES" : "NO") . "<br/>";
            $content .= "<b>Parameters : </b>  " . ((isset($details->{'parameters'}) && count($details->{'parameters'}) > 0) ? implode(", " , $details->{'parameters'}) : "NONE") . "<br/>";
            $content .= "<b>Optional Parameters : </b>  " . ((isset($details->{'optionalParameters'}) && count($details->{'optionalParameters'}) > 0) ? implode(", " , $details->{'optionalParameters'}) : "NONE") . "<br/>";
            $content .= "<b>Returns: </b> "  . $details->{'returns'} . "<br/>";
            $content .= "</div>";
            echo $content;
          
          }
          } else echo "<p>API has no contents.</p>";
       
       }
       
    }


?>
